Virtual DOM
仮想DOM_
必要最小限のDOM更新
発祥はReactで、後にElmなどに輸入された
vdomのリポジトリ
github
VDOMはJSONで表現することが多い
ASTと同じような感じ
code:ts
{
nodeName: "div",
children: [
{
nodeName: "input",
attributes: {
type: "text",
placeholder: "Search",
onChange: ""
},
children: []
},
{
nodeName: "List",
attributes: {
items: "Hoge", "Piyo"
},
children: []
}
]
};
DOM構築
整合性のチェック
レンダリングツリーの構築
レイアウト計算
など
データの流れの一例 ref
JSX
↓Babelで
pure JS
この変換要る?コンパイラがなくて作るの面倒だからかなmrsekut.icon
この変換は静的に行えるから別にパフォーマンス云々の問題にならないからどうでもいいんか
↓Preactのh関数で
VDOM(json)
↓Preactの関数で
DOM
流れ
仮想DOMツリーを2種類用意する(変更前後のツリー2種類)
何らかのアクションでstateが書き換わる
仮想DOMを再構築する
変更前後の仮想DOMツリーを用いて差分検知する
差分があった箇所だけリアルDOMに反映する
変更時の内部手順
初回は全画面をVDOMで構築
これを本物のDOMに変換して描画
変更があったら、再び全画面をVDOMで構築
一つ昔のVDOMと比較し、差分のみを本物のDOMに反映する
memo
変更のたびにVDOMを全て作るのは仕方がないっぽい
ここも改善できたらもっと速くなりそうだなー(こなみ)mrsekut.icon
本物のDOMを作るコストよりはめちゃくちゃ低いらしい
ツリーの比較アルゴリズム
reconciliation
要素のタグが変更されたら、その子も全て変更する
ある要素がツリーの別の改装に移動することはない
同じ階層で要素が入れ替わるときは、要素に付けた一意のkeyで追跡する
memo
全ての比較をするわけではなく、重要なところだけを見てコストを抑えているらしい
#??
アニメーションとかどうやってるんだ?
VDOMからDOMを作る内部処理をしりたい
そもそもブラウザってどうやって描画してるんだ?
DOM作成のどの辺の処理がコストが高い原因になってるの?
仮想DOM 自作
https://qiita.com/ne_no_usa/items/29ae8e5bcccfec41a626
rs
https://docs.google.com/presentation/d/1qbgPleB81tqWrio9hSsRBp5iezgHjjPY7Hums0z_d5A/preview?slide=id.g18b1f325318_0_173
rs
参考
『基礎からわかるElm』 p.154-
仮想DOMの内部の動き | POSTD
くわしい
まだ全部読んでない
https://kuroeveryday.blogspot.com/2018/11/how-to-create-virtual-dom-framework.html
作って学ぶ
https://medium.com/@deathmood/how-to-write-your-own-virtual-dom-ee74acc13060
https://github.com/jorgebucaran/hyperapp
https://employment.en-japan.com/engineerhub/entry/2020/02/18/103000
https://qiita.com/uhyo/items/1c565b61d934cbb88c2e
普通のDOM
https://ja.reactjs.org/docs/reconciliation.html
https://www.techpit.jp/p/dom
https://qiita.com/umashiba/items/e2a9776e6c44a40d2d8f